package com.baishancloud.log.common.util

import org.apache.commons.lang3.StringUtils

import java.util
import java.util.Objects
import java.util.regex.Pattern
import scala.collection.mutable

/**
 *
 * @author ziqiang.wang 
 * @date 2021/11/12 11:40
 */
object StringUtil extends Serializable {


  /**
   * 按照指定最大长度截取字符串<br>
   *
   * @param value 字符串
   * @param max   最大长度
   * @return 如果最大长度超过了字符串长度，则返回原始字符串；如果最大长度不大于原始字符串长度，则返回指定最大长度的子字符串。
   */
  def subString(value: String, max: Int): String = {
    if (value == null) {
      null
    } else {
      value.substring(0, math.min(value.length, max))
    }
  }


  /**
   * 判断字符串是否为自然数，也就是全是数字的正则表达式
   */
  private val isNaturalNumber: Pattern = Pattern.compile("\\d+")

  /**
   * 判断字符串是否为自然数，也就是全是数字
   *
   * @param value 待判断字符串
   * @return 是否为自然数
   */
  def isLong(value: String): Boolean = {
    if (value == null) false else isNaturalNumber.matcher(value).matches()
  }

  /**
   * 判断字符串是否为数字的正则表达式，可判断正负数、小数
   */
  private val isNumber = Pattern.compile("^([-+])?\\d+(\\.\\d+)?$")

  /**
   * 判断一个字符串是否为数字，包含正负数、小数
   *
   * @param value 待判断的字符串
   * @return 字符串是否为数字
   */
  def isNumber(value: String): Boolean = {
    if (value == null) false else isNumber.matcher(value).matches()
  }

  /**
   * 将指定字符串按照指定分隔符号进行分隔
   *
   * @param value         原始字符串
   * @param separatorChar 指定分隔符号
   * @return 返回最令人满意的结果，开始位置和结束位置为分隔符号时，也会在对应位置设置空字符串
   */
  def split(value: String, separatorChar: Char): util.List[String] = {
    val result: util.List[String] = new util.ArrayList[String]
    if (StringUtils.isEmpty(value)) return result
    val temp: mutable.StringBuilder = new mutable.StringBuilder
    for (aChar <- value.toCharArray) {
      if (!Objects.equals(aChar, separatorChar)) { // 如果不是分隔字符串，则将该位置字符进行拼接
        temp.append(aChar)
      }
      else { // 如果是分隔字符串，则将之前的所有字符串写出到结果列表
        result.add(temp.toString)
        temp.delete(0, temp.length)
      }
    }
    if (value.endsWith(String.valueOf(separatorChar))) result.add("")
    result
  }

}
